﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Data.SqlClient;
using SBS;

namespace Data
{
    class Kunde_DB
    {
        public static string ConnectionString
        {
            get { return @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SBSdb.mdf;Integrated Security=True;User Instance=True"; }
        }
        public static string HentByNavn(int postNr)
        {
            string sql = "SELECT Bynavn FROM Postnr_by WHERE Postnr =" + postNr;
            SqlConnection conn = new SqlConnection(ConnectionString);
            try
            {
                conn.Open();
                SqlCommand com = new SqlCommand(sql, conn);
                SqlDataReader reader = com.ExecuteReader();

               while(reader.Read())
                return reader[0].ToString();

                //Hvis intet bynavn findes
               return "";
            }

            catch(Exception ex)
            {
                throw new Exception(ex.Message);
            }

            finally
            {
                conn.Close();
            }
        }
        public static List<Scooter> HentKundensScooter(int Knr)
        {
            List<Scooter> KundesScooter = new List<Scooter>();
            string sql = "SELECT * FROM Scooter WHERE Knr =" + Knr;
            SqlConnection conn = new SqlConnection(ConnectionString);
            try
            {
                conn.Open();
                SqlCommand com = new SqlCommand(sql, conn);
                com.ExecuteNonQuery();

                return KundesScooter;
            }

            catch (Exception ex)
            {

                throw new Exception(ex.Message);


            }

            finally
            {
                conn.Close();
            }
        }
        public static bool GemKunde(Kunde AktivKunde, out int Knr)
        {
            //Indsætter AktivKunde
            string sql = "INSERT INTO InsertKunde VALUES('" + AktivKunde.Fornavn + "','" + AktivKunde.Efternavn + "','" + AktivKunde.Adresse + "','" + AktivKunde.Postnr + "','" + AktivKunde.Mail + "','"+AktivKunde.TlfNr +"')";
            
            //Henter Knr
            string sqlHentKnr = "SELECT TOP (1) Knr FROM Kunde ORDER BY Knr DESC";

            SqlConnection conn = new SqlConnection(ConnectionString);
            
            conn.Open();
            
            try
            {
                SqlCommand com = new SqlCommand(sql, conn);
                com.ExecuteNonQuery();

                com = new SqlCommand(sqlHentKnr, conn);
                SqlDataReader reader = com.ExecuteReader();
                reader.Read();
                Knr = (int)reader[0];
                reader.Close();

                foreach ( KeyValuePair<string, Scooter> s in AktivKunde.Scootere)
                {
                    string sqlScooter = "INSERT INTO Scooter VALUES('" + s.Key + "',CONVERT(DATETIME,'" + s.Value.SidsteService + "',104)," + s.Value.Aar + "," + s.Value.AntKm + ",'" + s.Value.Model + "'," + s.Value.Certifikat.CertNr + "," + Knr + ")";
                    com = new SqlCommand(sqlScooter,conn);
                    com.ExecuteNonQuery();
                }

                return true;
            }

            catch
            {
                Knr = 0;
                return false;


            }

            finally
            {
                conn.Close();
            }
        }
        /// <summary>
        /// Henter en kunde med dennes scootere
        /// </summary>
        /// <param name="Knr">Kunde nummer</param>
        /// <returns>Kunde objekt</returns>
        public static Kunde HentKundeInfo(int Knr)
        {
            //Vi laver en objekt reference af Kunde klassen, indtil videre
            // er den null, men senere fyldes den og sendes som returværdi
            Kunde k = null;
            //Denne sql streng henter fra vores View Kunde_Postnr
            string sqlKunde = "SELECT * FROM Kunde_Postnr WHERE Knr = " + Knr;
            //Denne sql streng henter fra vores View Scooter_Cert
            string sqlScooterOgCert = "SELECT * FROM Scooter_Cert WHERE Knr = " + Knr;

            SqlConnection conn = new SqlConnection(ConnectionString);

            try
            {
                conn.Open();
                SqlCommand com = new SqlCommand(sqlKunde, conn);
                SqlDataReader KundeReader = com.ExecuteReader();

                while (KundeReader.Read())
                {
                    //Vi læser al informationen fra datareaderen ind i
                    //en constructor.
                    k = new Kunde(Knr,KundeReader[1].ToString(), KundeReader[2].ToString(), KundeReader[4].ToString(), KundeReader[3].ToString(), KundeReader[6].ToString(), Convert.ToInt32(KundeReader[5]),KundeReader[7].ToString());
                }
                KundeReader.Close();
                
                //Nu har vi primær information om kunden og
                //og vi er nu klar til at hente kundens scootere
                com = new SqlCommand(sqlScooterOgCert, conn);
                SqlDataReader ScooterReader = com.ExecuteReader();

                Scooter s;

                while (ScooterReader.Read())
                {
                    //For hver scooter kunden har oprettes der et
                    //Scooter objekt og et tilsvarende certifikat.
                    s = new Scooter(ScooterReader[0].ToString(),Convert.ToDateTime(ScooterReader[1]),Convert.ToInt32(ScooterReader[2]),Convert.ToDouble(ScooterReader[3]),Convert.ToInt32(ScooterReader[4]),ScooterReader[5].ToString(),ScooterReader[6].ToString());

                    //Scooter objektet s tilføjes i kundens Scooter 
                    //collection
                    k.Scootere.Add(s.RegNr, s);

                }
                //til sidst returneres Kunde objektet og sættes lig
                //aktivKunde referencen i KundeKataloget.
                return k;
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                conn.Close();
            }

            
        }
        /// <summary>
        /// Henter en list hvor hver Kunde har en scooter. 
        /// </summary>
        /// <param name="dato"></param>
        /// <returns></returns>
        public static List<Kunde> HentKundeSidsteBesøgsRapport(DateTime dato)
        {
            List<Kunde> liste = new List<Kunde>();
            string sql = "SELECT S.Regnr,S.Sidstservice,C.Certnr,C.Certnavn,S.Model,K.Kfornavn,K.Kefternavn,K.Kadresse,K.Kpostnr,P.Bynavn FROM Scooter S INNER JOIN Kunde K ON S.Knr = K.Knr INNER JOIN Certificat C ON S.Certnr = C.Certnr INNER JOIN Postnr_by P ON K.Kpostnr = P.Postnr WHERE Sidstservice <= CONVERT(DATETIME,'" + dato.ToString() + "',104)";

            SqlConnection conn = new SqlConnection(ConnectionString);

            try
            {
                conn.Open();
                SqlCommand com = new SqlCommand(sql, conn);
                SqlDataReader reader = com.ExecuteReader();

                while (reader.Read())
                {
                    Scooter s = new Scooter(reader[0].ToString(), DateTime.Parse(reader[1].ToString()), int.Parse(reader[2].ToString()), reader[3].ToString(), reader[4].ToString());
                    Kunde k = new Kunde(reader[5].ToString(), reader[6].ToString(), reader[7].ToString(), reader[9].ToString(), int.Parse(reader[8].ToString()), reader[0].ToString(), s);
                    liste.Add(k);

                    
                }


                return liste;
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

            finally
            {
                conn.Close();
            }


        }

        public static bool OpdaterKunde(Kunde AktivKunde)
        {
            //Opdaterer AktivKunde
            string sql = "UPDATE Kunde set Kfornavn ='" + AktivKunde.Fornavn + "',Kefternavn ='" + AktivKunde.Efternavn + "',Kadresse ='" + AktivKunde.Adresse + "',Kpostnr =" + AktivKunde.Postnr + ",Kmail ='" + AktivKunde.Mail + "', Ktlfnr ='" + AktivKunde.TlfNr + "' WHERE Knr = "+AktivKunde.Knr;

           

            SqlConnection conn = new SqlConnection(ConnectionString);

            conn.Open();

            try
            {
                SqlCommand com = new SqlCommand(sql, conn);
                com.ExecuteNonQuery();

               

               
                

                    foreach (KeyValuePair<string, Scooter> s in AktivKunde.Scootere)
                    {
                        //Hvis den er blevet tilføjet idag, skal vi oprette den ellers opdaterer vi blot
                        if (s.Value.SidsteService.Date == DateTime.Today)
                        {
                            string sqlScooter = "INSERT INTO Scooter VALUES('" + s.Key + "','" + s.Value.SidsteService + "'," + s.Value.Aar + "," + s.Value.AntKm + ",'" + s.Value.Model + "'," + s.Value.Certifikat.CertNr + "," + AktivKunde.Knr + ")";
                            com = new SqlCommand(sqlScooter, conn);
                            com.ExecuteNonQuery();


                        }
                        else
                        {
                            string sqlScooter = "UPDATE Scooter SET SidstService = CONVERT(DATETIME,'" + s.Value.SidsteService + "',104),Aar = " + s.Value.Aar + ",Antkm =" + s.Value.AntKm + ",Model = '" + s.Value.Model + "', Certnr = " + s.Value.Certifikat.CertNr + " WHERE Regnr = '" +s.Key+"'" ;
                            com = new SqlCommand(sqlScooter, conn);
                            com.ExecuteNonQuery();
                        }
                    }
                
                return true;
            }

            catch
            {
                
                return false;


            }

            finally
            {
                conn.Close();
            }
        }

        public static List<Kunde> HentKundeListe()
        {
            List<Kunde> liste = new List<Kunde>();
            string sql = "SELECT * from Kunde_Postnr ORDER BY Kefternavn ASC";

            SqlConnection conn = new SqlConnection(ConnectionString);

            try
            {
                conn.Open();

                SqlCommand com = new SqlCommand(sql, conn);

                SqlDataReader reader = com.ExecuteReader();

                while (reader.Read())
                {
                    Kunde k = new Kunde(int.Parse(reader[0].ToString()), reader[1].ToString(), reader[2].ToString(), reader[4].ToString(), reader[3].ToString(), reader[6].ToString(), int.Parse(reader[5].ToString()), reader[7].ToString());
                    liste.Add(k);
                }

                return liste;

            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

            finally
            {
                conn.Close();
            }

        }

        public static List<Kunde> HentScootereMedEjer()
        {
            List<Kunde> liste = new List<Kunde>();
            string sql = "SELECT S.Regnr,S.Sidstservice,C.Certnr,C.Certnavn,S.Model,K.Kfornavn,K.Kefternavn,K.Kadresse,K.Kpostnr,P.Bynavn FROM Scooter S INNER JOIN Kunde K ON S.Knr = K.Knr INNER JOIN Certificat C ON S.Certnr = C.Certnr INNER JOIN Postnr_by P ON K.Kpostnr = P.Postnr ORDER BY C.Certnavn,S.Model";

            SqlConnection conn = new SqlConnection(ConnectionString);

            try
            {
                conn.Open();
                SqlCommand com = new SqlCommand(sql, conn);
                SqlDataReader reader = com.ExecuteReader();

                while (reader.Read())
                {
                    Scooter s = new Scooter(reader[0].ToString(), DateTime.Parse(reader[1].ToString()), int.Parse(reader[2].ToString()), reader[3].ToString(), reader[4].ToString());
                    Kunde k = new Kunde(reader[5].ToString(), reader[6].ToString(), reader[7].ToString(), reader[9].ToString(), int.Parse(reader[8].ToString()), reader[0].ToString(), s);
                    liste.Add(k);


                }


                return liste;
            }

            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }

            finally
            {
                conn.Close();
            }

        }
    }
}
